package com.hq.stream;

import org.junit.Assert;
import org.junit.Test;

import java.util.Objects;
import java.util.function.IntToLongFunction;
import java.util.function.Predicate;

/**
 * 谓词  条件描述主语
 * predicate的中文意思是“断定”，即判断的意思，判断某个东西是否满足某种条件；
 * 因此它包含test方法，根据输入值来做逻辑判断，其结果为True或者False。
 * @author hq
 */
public class PredicateTest {
    @Test
    public void  test(){
        Predicate<Integer> predicate = new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) {
                return false;
            }
            @Override
            public Predicate<Integer> and(Predicate<? super Integer> other) {
                Objects.requireNonNull(other);
                return (t) -> test(t) && other.test(t);
            }
            @Override
            public Predicate<Integer> negate() {
                return null;
            }
            @Override
            public Predicate<Integer> or(Predicate<? super Integer> other) {
                Objects.requireNonNull(other);
                return (t) -> test(t) || other.test(t);
            }
        };


        Predicate<String> p = o -> o.equals("test");
        Predicate<String> g = o -> o.startsWith("t");

        /**
         * negate: 用于对原来的Predicate做取反处理；
         * 如当调用p.test("test")为True时，调用p.negate().test("test")就会是False；
         */
        Assert.assertFalse(p.negate().test("test"));

        /**
         * and: 针对同一输入值，多个Predicate均返回True时返回True，否则返回False；
         */
        Assert.assertTrue(p.and(g).test("test"));

        /**
         * or: 针对同一输入值，多个Predicate只要有一个返回True则返回True，否则返回False
         */
        Assert.assertTrue(p.or(g).test("ta"));


        IntToLongFunction intToLongFunction = value -> value*2;
        Long b =  intToLongFunction.applyAsLong(2);
        System.out.println(b);
    }
}
